library(tidyverse) # tidy style coding
library(brms) # Bayesian models
library(loo) # for information criteria
library(tidybayes) # Bayesian aesthetics
library(MetBrewer) # colours
library(kableExtra) # tables
library(patchwork) # putting plots together
library(DT) # for search- and saveable tables
library(pander) # for simpler tables

Load in the data

We analyse data collected across three cohorts of students (2021-2023) enrolled in the third year School of Biosciences subject, Animal Behaviour, at The University of Melbourne. We hereafter refer to students as observers.

data <- read_csv("pigeon_data.csv") %>% 
  mutate(Student_ID = as.factor(Student_ID),
         Year = as.factor(Year),
         Foraging_prop = (Foraging_percentage / 100)) %>%
  filter(Year %in% c("2021", "2022", "2023"),
         Foraging_percentage != "NA",
         Primer_understood != "NA") %>%
  filter(Student_ID != "60" & Student_ID != "68" & Student_ID != "70" & Student_ID != "72") %>% # remove students that completed the task multiple times
  #Student_ID %in% c("60", "68", "70", "72")) %>% 
  select(-c(First_name, Surname, Peck_mean)) %>%  # remove names when ready
  rename(Observer_ID = Student_ID)

data_peck <- 
  data %>%
  filter(Peck_rate_2 != "NA") %>% 
  pivot_longer(cols = Peck_rate_1:Peck_rate_2, names_to = "Trial",
               values_to = "Peck_rate")
  
# Create a function to build HTML searchable tables

my_data_table <- function(df){
  datatable(
    df, rownames=FALSE,
    autoHideNavigation = TRUE,
    extensions = c("Scroller",  "Buttons"),
    options = list(
      dom = 'Bfrtip',
      deferRender=TRUE,
      scrollX=TRUE, scrollY=400,
      scrollCollapse=TRUE,
      buttons =
        list('pageLength', 'colvis', 'csv', list(
          extend = 'pdf',
          pageSize = 'A4',
          orientation = 'landscape',
          filename = 'full_dataset')),
      pageLength = 78
    )
  )
}


my_data_table(data)

Column explanations

Observer_ID: unique, anonymised identifier for each observer.

Year: year that the experiment was conducted

Bias_treatment: the primer the observer received, where ‘satiated’ indicates that the observers were provided information prior to a trial that suggested pigeons were fell fed, whereas ‘hungry’ indicated that the pigeons were in poor condition and hungry.

Expectation: we asked the observers to indicate whether they thought the pigeons would be hungry or satiated. We included this question to test whether observers were appropriately primed by their bias treatment.

Primer_understood: did the observer’s expectation match the primer they received?

Foraging_percentage: the percentage of pigeons that observers estimated to be foraging over a 15 second period, while observing a large flock.

Peck_rate_1: the number of times a single chosen pigeon pecked the ground over a 15 second period.

Peck_rate_2: the number of times a second chosen pigeon pecked the ground over a 15 second period.

Foraging_prop: proportion of pigeons estimated to be foraging

\(~\)

Question 1: is estimation of foraging percentage affected by bias manipulations?

\(~\)

The full model

Here we fit a beta distributed model, with the proportion of pigeons estimated to be foraging as the response variable. We include Bias_treatment and Primer_understood as fixed effects as well as their two-way interaction.

foraging_model <- brm(Foraging_prop ~ 1 + Bias_treatment * Primer_understood,
                                data = data, family = Beta,
                                prior = c(prior(normal(0, 1), class = Intercept),
                                          prior(normal(0, 1.5), class = b),
                                          prior(exponential(1), class = phi)),
                                iter = 6000, warmup = 2000, chains = 4, cores = 4,
                                control = list(adapt_delta = 0.8, max_treedepth = 10),
                                seed = 1, file = "fits/foraging_model")

foraging_model
##  Family: beta 
##   Links: mu = logit; phi = identity 
## Formula: Foraging_prop ~ 1 + Bias_treatment * Primer_understood 
##    Data: data (Number of observations: 78) 
##   Draws: 4 chains, each with iter = 6000; warmup = 2000; thin = 1;
##          total post-warmup draws = 16000
## 
## Population-Level Effects: 
##                                             Estimate Est.Error l-95% CI
## Intercept                                      -0.44      0.29    -1.01
## Bias_treatmentSatiated                          0.23      0.36    -0.47
## Primer_understoodYES                           -0.03      0.32    -0.65
## Bias_treatmentSatiated:Primer_understoodYES    -0.36      0.42    -1.20
##                                             u-95% CI Rhat Bulk_ESS Tail_ESS
## Intercept                                       0.11 1.00     8388     9712
## Bias_treatmentSatiated                          0.94 1.00     7407     9233
## Primer_understoodYES                            0.59 1.00     8038     9395
## Bias_treatmentSatiated:Primer_understoodYES     0.46 1.00     6970     8707
## 
## Family Specific Parameters: 
##     Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
## phi     4.25      0.62     3.15     5.56 1.00    12880    11002
## 
## Draws were sampled using sampling(NUTS). For each parameter, Bulk_ESS
## and Tail_ESS are effective sample size measures, and Rhat is the potential
## scale reduction factor on split chains (at convergence, Rhat = 1).

This output is pretty unreadable. To make interpretation easier, we can plot predictions from the model.

\(~\)

Calculate posterior means and difference contrasts

Here we sample 4000 draws from the posterior distribution to estimate the mean for each treatment combination in our model. With these draws we can build a distribution of the mean for each relevant combination.

The first couple of rows are shown below:

new_data <- expand.grid(Bias_treatment = c("Hungry", "Satiated"),
                        #Year = c("2021", "2022", "2023"),
                        Primer_understood = c("YES", "NO")) %>% 
  as_tibble()

foraging_predictions <- fitted(foraging_model, new_data, summary = F)

foraging_predictions_draws <-
  foraging_predictions %>% 
  as_tibble() %>% 
  rename(Hungry_YES = V1,
         Satiated_YES = V2,
         Hungry_NO = V3,
         Satiated_NO = V4) %>% 
  pivot_longer(names_to = "Primer", values_to = "Estimate", cols = 1:4) %>%
  separate(Primer, 
           into = c("Primer", "Primer_understood"), 
           sep = "_") %>% 
  mutate(Estimate = Estimate *100,
         Primer_understood = case_when(Primer_understood == "NO" ~ "Primer understood = NO",
                                       Primer_understood == "YES" ~ "Primer understood = YES")) 

Figure S1

We can plot these distributions using the stat_halfeye geom that comes with the tidybayes package.

foraging_predictions_draws %>% 
   ggplot(aes(x = Estimate, y = Primer, fill = Primer)) + 
  stat_halfeye(aes(fill = Primer), .width = c(0.66, 0.95), alpha = 0.9,
               point_interval = "median_qi", point_fill = "white",
               shape = 21, point_size = 4, stroke = 1.5) + # width indicates the uncertainty intervals: here we have 66% and 95% intervals
  scale_fill_manual(values = met.brewer("Hiroshige", 2)) +
  #coord_flip() +
  #geom_vline(xintercept = 0, linetype = 2) +
  #scale_y_continuous(breaks = c(, 0, 1)) +
  xlab("Estimated % pigeons foraging") +
  facet_grid(~Primer_understood) +
  ylab("Primer delivered") +
  theme_bw() + 
  theme(legend.position = "none",
        panel.grid.minor = element_blank(),
        text = element_text(size = 16))

Figure S1. Posterior means for estimated proportions of pigeons foraging. Observers were primed with one of two different statements that provided information on pigeon condition - they suggested that pigeons were either satiated or hungry. The plot is split into four: columns indicate the year of observation, while rows split the estimates by whether the observer expectation of pigeon hunger matched the primer they received. The coloured area is the posterior distribution and the black point is the mean estimate with associated 67% and 95% uncertainty intervals.

\(~\)

Table S1. Posterior estimates for the percentages of pigeons foraging, broken into the four treatment combinations.

new_data %>% 
cbind(fitted(foraging_model, new_data, summary = T) %>%
        as_tibble() %>% 
        mutate(across(1:4, ~ .x *100),
               across(1:4, round, 2))) %>% 
  pander()
Bias_treatment Primer_understood Estimate Est.Error Q2.5 Q97.5
Hungry YES 38.3 3.59 31.34 45.44
Satiated YES 35.28 4.22 27.32 43.78
Hungry NO 39.27 6.67 26.77 52.8
Satiated NO 44.72 5.88 33.36 56.33

\(~\)

Exploring allocation versus expectation 1

\(~\)

We find that 22 of the 78 observers indicated a feeding motivation expectation opposite to that suggested by the primer they were allocated.

The model above indicates that attention paid to and/or comprehension of the primer statement has a large effect on observers’ perception of pigeon foraging. This suggests that Expectation may be a better predictor of foraging estimation than allocated Bias_treatment.

We explore this below by fitting two models:

  1. a model with allocated primer (Bias_treatment) as the predictor variable

  2. a model with indicated hunger expectation (Expectation) as the predictor variable

\(~\)

Model 1: allocated primer

# First let's model the effect of bias treatment on foraging estimation 

foraging_model_treatment <- brm(Foraging_prop ~ 0 + Bias_treatment,
                                     data = data, family = Beta,
                                     prior = c(prior(normal(0, 1.5), class = b),
                                               prior(exponential(1), class = phi)),
                                     iter = 6000, warmup = 2000, chains = 4, cores = 4,
                                     control = list(adapt_delta = 0.8, max_treedepth = 10),
                                     seed = 1, file = "fits/foraging_model_treatment")

foraging_model_treatment <- add_criterion(foraging_model_treatment, criterion = "loo", file = "fits/foraging_model_treatment")

Table S2. Posterior estimates of the percentage of pigeon feeding rate, split by the primer observers were allocated.

new_data_2 <- tibble(Bias_treatment = c("Hungry", "Satiated"))

new_data_2 %>% 
  cbind(fitted(foraging_model_treatment, newdata = new_data_2, summary = T) %>% 
          as_tibble() %>% 
          mutate(across(1:4, ~ .x *100),
                 across(1:4, round, 2))) %>% 
  rename("Estimated proportion foraging" = Estimate,
         "Bias treatment" = Bias_treatment) %>% 
  pander()
Bias treatment Estimated proportion foraging Est.Error Q2.5 Q97.5
Hungry 38.47 3.25 32.24 44.99
Satiated 38.59 3.51 31.85 45.65

Model 2: indicated expectation

# fit the same model, except using participant expectation rather than allocated bias treatment

foraging_model_expectation <- brm(Foraging_prop ~ 0 + Expectation,
                                     data = data, family = Beta,
                                     prior = c(prior(normal(0, 1.5), class = b),
                                               prior(exponential(1), class = phi)),
                                     iter = 6000, warmup = 2000, chains = 4, cores = 4,
                                     control = list(adapt_delta = 0.8, max_treedepth = 10),
                                     seed = 1, file = "fits/foraging_model_expectation")

foraging_model_expectation <- add_criterion(foraging_model_expectation, criterion = "loo", file = "fits/foraging_model_expectation")

#loo_compare(foraging_model_treatment, foraging_model_expectation)

Table S3. Posterior estimates of the percentage of pigeons foraging, split by the actual expectation of observers.

new_data_3 <- tibble(Expectation = c("Hungry", "Satiated"))

new_data_3 %>% 
  cbind(fitted(foraging_model_expectation, newdata = new_data_3, summary = T) %>% 
          as_tibble() %>% 
          mutate(across(1:4, ~ .x *100),
                 across(1:4, round, 2))) %>%  
  rename("Estimated proportion foraging" = Estimate,
         "Indicated expectation" = Expectation) %>% 
  pander()
Indicated expectation Estimated proportion foraging Est.Error Q2.5 Q97.5
Hungry 40.2 3.19 34.08 46.62
Satiated 36.38 3.56 29.61 43.56

\(~\)

Figure 1

\(~\)

Get posterior means and difference contrasts

# treatment model

draws_treatment <-
  as_draws_df(foraging_model_treatment) %>% 
  mutate(Hungry = inv_logit_scaled(b_Bias_treatmentHungry) *100,
         Satiated = inv_logit_scaled(b_Bias_treatmentSatiated)*100,
         diff_contrast = (Hungry - Satiated)) %>% 
  select(Hungry, Satiated, diff_contrast) %>% 
  pivot_longer(names_to = "Treatment", values_to = "Posterior_estimate", cols = 1:3) %>% 
  mutate(Predictor = "Allocated primer")

p2 <- 
  draws_treatment %>% 
  filter(Treatment != "diff_contrast") %>% 
  ggplot(aes(x = Treatment, y = Posterior_estimate)) + 
  stat_halfeye(aes(fill = Treatment), .width = c(0.66, 0.95), alpha = 0.9,
               point_interval = "median_qi", point_fill = "white",
               shape = 21, point_size = 4, stroke = 1.5) +
  scale_fill_manual(values = met.brewer("Hiroshige", 2)) +
  coord_flip(ylim = c(25, 55)) +
  #geom_vline(xintercept = 0, linetype = 2) +
  #scale_y_continuous(breaks = c(, 0, 1)) +
  xlab("Allocated primer") +
  ylab("Estimated % pigeons foraging") +
  theme_bw() + 
  theme(legend.position = "none",
        panel.grid.minor = element_blank(),
        text = element_text(size = 14))

p3 <-
  draws_treatment %>% 
  filter(Treatment == "diff_contrast") %>% 
  ggplot(aes(y = Posterior_estimate)) + 
   stat_halfeye(aes(fill = Treatment), .width = c(0.66, 0.95), alpha = 0.9,
               point_interval = "median_qi", point_fill = "white",
               shape = 21, point_size = 4, stroke = 1.5) +
  scale_fill_manual(values = met.brewer("Hiroshige")[4]) +
  coord_flip(ylim = c(-20, 20)) +
  geom_hline(yintercept = 0, linetype = 2) +
  #scale_y_continuous(breaks = c(, 0, 1)) +
  xlab(NULL) +
  ylab("Hungry - Satiated difference\ncontrast (% points)") +
  theme_bw() + 
  theme(legend.position = "none",
        panel.grid.minor = element_blank(),
        axis.text.y=element_blank(),
        axis.ticks.y=element_blank(),
        text = element_text(size = 14))

# expectation model

draws_expectation <-
  as_draws_df(foraging_model_expectation) %>% 
  mutate(Hungry = inv_logit_scaled(b_ExpectationHungry) *100,
         Satiated = inv_logit_scaled(b_ExpectationSatiated)*100,
         diff_contrast = (Hungry - Satiated)) %>% 
  select(Hungry, Satiated, diff_contrast) %>% 
  pivot_longer(names_to = "Treatment", values_to = "Posterior_estimate", cols = 1:3) %>% 
  mutate(Predictor = "Indicated expectation")

p4 <-
  draws_expectation %>% 
  filter(Treatment != "diff_contrast") %>% 
  ggplot(aes(x = Treatment, y = Posterior_estimate)) + 
   stat_halfeye(aes(fill = Treatment), .width = c(0.66, 0.95), alpha = 0.9,
               point_interval = "median_qi", point_fill = "white",
               shape = 21, point_size = 4, stroke = 1.5) +
  scale_fill_manual(values = met.brewer("Hiroshige", 2)) +
  coord_flip(ylim = c(25, 55)) +
  #geom_vline(xintercept = 0, linetype = 2) +
  #scale_y_continuous(breaks = c(, 0, 1)) +
  xlab("Indicated expectation") +
  ylab("Estimated % pigeons foraging") +
  theme_bw() + 
  theme(legend.position = "none",
        panel.grid.minor = element_blank(),
        text = element_text(size = 14))

p5 <-
  draws_expectation %>% 
  filter(Treatment == "diff_contrast") %>% 
  ggplot(aes(y = Posterior_estimate)) + 
    stat_halfeye(aes(fill = Treatment), .width = c(0.66, 0.95), alpha = 0.9,
               point_interval = "median_qi", point_fill = "white",
               shape = 21, point_size = 4, stroke = 1.5) +
  scale_fill_manual(values = met.brewer("Hiroshige")[4]) +
  coord_flip(ylim = c(-20, 20)) +
  geom_hline(yintercept = 0, linetype = 2) +
  #scale_y_continuous(breaks = c(, 0, 1)) +
  xlab(NULL) +
  ylab("Hungry - Satiated difference\ncontrast (% points)") +
  theme_bw() + 
  theme(legend.position = "none",
        panel.grid.minor = element_blank(),
        axis.text.y=element_blank(),
        axis.ticks.y=element_blank(),
        text = element_text(size = 14))

Plot

(p2 + p3) / (p4 + p5) +
   plot_annotation(tag_levels = 'a')

Figure 1. Posterior mean estimates and difference contrasts for observer estimated pigeon foraging. a shows the posterior means for observers that either received a primer that indicated satiated pigeons or one that indicated hungry pigeons. b shows the posterior difference between the mean estimates shown in a. c and d show the same posteriors as a and b except these are split by the indicated expectation of the observer’s, rather than those allocated to them. The coloured area is the posterior distribution and the black point is the mean estimate with associated 67% and 95% uncertainty intervals.

\(~\)

Question 2: is estimation of feeding rate affected by bias manipulations?

We asked observers to count the number of pecks of the ground that a selected pigeon made over a 1 minute period. We use the number of pecks that occur as a measure of feeding rate.

peck_rate_model <- brm(Peck_rate ~ 1 + Bias_treatment * Primer_understood + (1|Observer_ID),
                                data = data_peck, family = negbinomial,
                                prior = c( prior(normal(0, 1.5), class = Intercept),
                                          prior(normal(0, 1.5), class = b),
                                          prior(exponential(1), class = sd)),
                                iter = 6000, warmup = 2000, chains = 4, cores = 4,
                                control = list(adapt_delta = 0.9, max_treedepth = 10),
                                seed = 1, file = "fits/peck_rate_model")

peck_rate_model
##  Family: negbinomial 
##   Links: mu = log; shape = identity 
## Formula: Peck_rate ~ 1 + Bias_treatment * Primer_understood + (1 | Observer_ID) 
##    Data: data_peck (Number of observations: 156) 
##   Draws: 4 chains, each with iter = 6000; warmup = 2000; thin = 1;
##          total post-warmup draws = 16000
## 
## Group-Level Effects: 
## ~Observer_ID (Number of levels: 78) 
##               Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
## sd(Intercept)     0.20      0.14     0.01     0.52 1.00     3922     7202
## 
## Population-Level Effects: 
##                                             Estimate Est.Error l-95% CI
## Intercept                                       1.97      0.28     1.44
## Bias_treatmentSatiated                          0.34      0.35    -0.35
## Primer_understoodYES                            0.45      0.31    -0.18
## Bias_treatmentSatiated:Primer_understoodYES    -0.67      0.41    -1.46
##                                             u-95% CI Rhat Bulk_ESS Tail_ESS
## Intercept                                       2.54 1.00     9790    10891
## Bias_treatmentSatiated                          1.02 1.00     9339    10172
## Primer_understoodYES                            1.03 1.00     9915    11248
## Bias_treatmentSatiated:Primer_understoodYES     0.14 1.00     8677     9833
## 
## Family Specific Parameters: 
##       Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
## shape     0.92      0.12     0.70     1.20 1.00    11829     8799
## 
## Draws were sampled using sampling(NUTS). For each parameter, Bulk_ESS
## and Tail_ESS are effective sample size measures, and Rhat is the potential
## scale reduction factor on split chains (at convergence, Rhat = 1).

Another unreadable output Let’s look at the model predictions again.

\(~\)

Calculate posterior means and difference contrasts

new_data <- expand.grid(Bias_treatment = c("Hungry", "Satiated"),
                        #Year = c("2021", "2022"),
                        Primer_understood = c("YES", "NO")) %>% 
  as_tibble()

peck_predictions <- fitted(peck_rate_model, new_data, summary = F, re_formula = NA)
  
peck_predictions_draws <-
  peck_predictions %>% 
  as_tibble() %>% 
  rename(Hungry_YES = V1,
         Satiated_YES = V2,
         Hungry_NO = V3,
         Satiated_NO = V4) %>% 
  pivot_longer(names_to = "Primer", values_to = "Estimate", cols = 1:4) %>%
  separate(Primer, 
           into = c("Primer", "Primer_understood"), 
           sep = "_") %>% 
    mutate(Primer_understood = case_when(Primer_understood == "NO" ~ "Primer understood = NO",
                                       Primer_understood == "YES" ~ "Primer understood = YES")) 

\(~\)

Figure S2

peck_predictions_draws %>% 
  ggplot(aes(x = Estimate, y = Primer, fill = Primer)) + 
  stat_halfeye(aes(fill = Primer), .width = c(0.66, 0.95), alpha = 0.9,
               point_interval = "median_qi", point_fill = "white",
               shape = 21, point_size = 4, stroke = 1.5) +
  scale_fill_manual(values = met.brewer("Hiroshige", 2)) +
  coord_cartesian(xlim = c(0, 20)) +
  #geom_vline(xintercept = 0, linetype = 2) +
  #scale_y_continuous(breaks = c(, 0, 1)) +
  xlab("Estimated peck rate") +
  facet_grid(~Primer_understood) +
  ylab("Allocated primer") +
  theme_bw() + 
  theme(legend.position = "none",
        panel.grid.minor = element_blank(),
        text = element_text(size = 16))

Figure S2. Posterior means for observer estimated pigeon feeding rate. Observers were primed with one of two different statements that provided information on pigeon condition - they suggested that pigeons were either satiated or hungry. The plot is split into four: columns indicate the year of observation, while rows split the estimates by whether the observer expectation of pigeon hunger matched the primer they received. The coloured area is the posterior distribution and the black point is the mean estimate with associated 67% and 95% uncertainty intervals.

\(~\)

Table S4. Posterior estimates of pigeon feeding rate, broken into the four treatment combinations.

new_data %>% 
cbind(fitted(peck_rate_model, new_data, summary = T, re_formula = NA) %>%
        as_tibble() %>% 
        mutate(across(1:4, round, 2))) %>% 
  pander()
Bias_treatment Primer_understood Estimate Est.Error Q2.5 Q97.5
Hungry YES 11.27 1.64 8.43 14.79
Satiated YES 8.15 1.42 5.78 11.31
Hungry NO 7.43 2.16 4.24 12.63
Satiated NO 10.34 2.4 6.53 15.93

\(~\)

Exploring allocation versus expectation 2.0

\(~\)

Once again, we find that attention paid to and/or comprehension of the primer statement has a large effect on observers’ perception of pigeon foraging.

Lets again fit our two models:

  1. a model with allocated primer (Bias_treatment) as the predictor variable

  2. a model with indicated hunger expectation (Expectation) as the predictor variable

\(~\)

Model 1: allocated primer

# First let's model the effect of bias treatment on peck rate

peck_model_treatment <- brm(Peck_rate ~ 0 + Bias_treatment + (1|Observer_ID),
                                     data = data_peck, family = negbinomial,
                                     prior = c(prior(normal(0, 1.5), class = b),
                                               prior(exponential(1), class = sd)),
                                     iter = 6000, warmup = 2000, chains = 4, cores = 4,
                                     control = list(adapt_delta = 0.9, max_treedepth = 12),
                                     seed = 1, file = "fits/peck_model_treatment")

peck_model_treatment <- add_criterion(peck_model_treatment, criterion = "loo", file = "fits/peck_model_treatment")
  
peck_model_treatment
##  Family: negbinomial 
##   Links: mu = log; shape = identity 
## Formula: Peck_rate ~ 0 + Bias_treatment + (1 | Observer_ID) 
##    Data: data_peck (Number of observations: 156) 
##   Draws: 4 chains, each with iter = 6000; warmup = 2000; thin = 1;
##          total post-warmup draws = 16000
## 
## Group-Level Effects: 
## ~Observer_ID (Number of levels: 78) 
##               Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
## sd(Intercept)     0.21      0.14     0.01     0.53 1.00     3991     7207
## 
## Population-Level Effects: 
##                        Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS
## Bias_treatmentHungry       2.32      0.13     2.06     2.58 1.00    12607
## Bias_treatmentSatiated     2.16      0.14     1.89     2.44 1.00    17264
##                        Tail_ESS
## Bias_treatmentHungry      10664
## Bias_treatmentSatiated    11608
## 
## Family Specific Parameters: 
##       Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
## shape     0.91      0.12     0.70     1.18 1.00    10537     9524
## 
## Draws were sampled using sampling(NUTS). For each parameter, Bulk_ESS
## and Tail_ESS are effective sample size measures, and Rhat is the potential
## scale reduction factor on split chains (at convergence, Rhat = 1).

Table S5. The estimated peck rate of foraging pigeons, split by the primer observers were allocated.

new_data_2 %>% 
  cbind(fitted(peck_model_treatment, newdata = new_data_2, summary = T, re_formula = NA) %>% 
          as_tibble() %>% 
          mutate(across(1:4, round, 2))) %>% 
  rename("Estimated peck rate" = Estimate,
         "Bias treatment" = Bias_treatment) %>% 
  pander()
Bias treatment Estimated peck rate Est.Error Q2.5 Q97.5
Hungry 10.24 1.36 7.84 13.15
Satiated 8.75 1.23 6.62 11.44

Model 2: Indicated expectation

# fit the same model, except using participant expectation rather than allocated bias treatment

peck_model_expectation <- brm(Peck_rate ~ 0 + Expectation + (1|Observer_ID),
                                     data = data_peck, family = negbinomial,
                                     prior = c(prior(normal(0, 1.5), class = b),
                                               prior(exponential(1), class = sd)),
                                     iter = 4000, warmup = 2000, chains = 4, cores = 4,
                                     control = list(adapt_delta = 0.95, max_treedepth = 12),
                                     seed = 1, file = "fits/peck_model_expectation")

peck_model_expectation <- add_criterion(peck_model_expectation, criterion = "loo", file = "fits/peck_model_expectation")


peck_model_expectation
##  Family: negbinomial 
##   Links: mu = log; shape = identity 
## Formula: Peck_rate ~ 0 + Expectation + (1 | Observer_ID) 
##    Data: data_peck (Number of observations: 156) 
##   Draws: 4 chains, each with iter = 4000; warmup = 2000; thin = 1;
##          total post-warmup draws = 8000
## 
## Group-Level Effects: 
## ~Observer_ID (Number of levels: 78) 
##               Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
## sd(Intercept)     0.19      0.13     0.01     0.49 1.00     2675     4041
## 
## Population-Level Effects: 
##                     Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
## ExpectationHungry       2.41      0.12     2.18     2.66 1.00     9057     6201
## ExpectationSatiated     2.00      0.14     1.73     2.28 1.00     9302     6075
## 
## Family Specific Parameters: 
##       Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
## shape     0.93      0.13     0.71     1.20 1.00     7486     5181
## 
## Draws were sampled using sampling(NUTS). For each parameter, Bulk_ESS
## and Tail_ESS are effective sample size measures, and Rhat is the potential
## scale reduction factor on split chains (at convergence, Rhat = 1).
#loo_compare(peck_model_treatment, peck_model_expectation)

Table S6. The estimated peck rate of foraging pigeons, split by the indicated expectation of the observers.

new_data_2 %>% 
  cbind(fitted(peck_model_expectation, newdata = new_data_3, summary = T, re_formula = NA) %>% 
          as_tibble() %>% 
          mutate(across(1:4, round, 2))) %>% 
  rename("Estimated peck rate" = Estimate,
         "Indicated expectation" = Bias_treatment) %>% 
  pander()
Indicated expectation Estimated peck rate Est.Error Q2.5 Q97.5
Hungry 11.27 1.41 8.84 14.29
Satiated 7.45 1.07 5.62 9.8

\(~\)

Figure 2

\(~\)

Get posterior means and difference contrasts

# treatment model

peck_draws_treatment <-
  as_draws_df(peck_model_treatment) %>% 
  mutate(Hungry = exp(b_Bias_treatmentHungry),
         Satiated = exp(b_Bias_treatmentSatiated),
         diff_contrast = (Hungry - Satiated)) %>% 
  select(Hungry, Satiated, diff_contrast) %>% 
  pivot_longer(names_to = "Treatment", values_to = "Posterior_estimate", cols = 1:3) %>% 
  mutate(Predictor = "Allocated primer")

p6 <- 
  peck_draws_treatment %>% 
  filter(Treatment != "diff_contrast") %>% 
  ggplot(aes(x = Treatment, y = Posterior_estimate)) + 
   stat_halfeye(aes(fill = Treatment), .width = c(0.66, 0.95), alpha = 0.9,
               point_interval = "median_qi", point_fill = "white",
               shape = 21, point_size = 4, stroke = 1.5) +
  scale_fill_manual(values = met.brewer("Hiroshige", 2)) +
  coord_flip(ylim = c(5, 20)) +
  #geom_vline(xintercept = 0, linetype = 2) +
  #scale_y_continuous(breaks = c(, 0, 1)) +
  xlab("Allocated primer") +
  ylab("Estimated pecks per min") +
  theme_bw() + 
  theme(legend.position = "none",
        panel.grid.minor = element_blank(),
        text = element_text(size = 14))

p7 <-
  peck_draws_treatment %>% 
  filter(Treatment == "diff_contrast") %>% 
  ggplot(aes(y = Posterior_estimate)) + 
   stat_halfeye(aes(fill = Treatment), .width = c(0.66, 0.95), alpha = 0.9,
               point_interval = "median_qi", point_fill = "white",
               shape = 21, point_size = 4, stroke = 1.5) +
  scale_fill_manual(values = met.brewer("Hiroshige")[4]) +
  coord_flip(ylim = c(-5, 12)) +
  geom_hline(yintercept = 0, linetype = 2) +
  #scale_y_continuous(breaks = c(, 0, 1)) +
  xlab(NULL) +
  ylab("Hungry - Satiated difference\ncontrast (pecks per min)") +
  theme_bw() + 
  theme(legend.position = "none",
        panel.grid.minor = element_blank(),
        axis.text.y=element_blank(),
        axis.ticks.y=element_blank(),
        text = element_text(size = 14))

# expectation model

peck_draws_expectation <-
  as_draws_df(peck_model_expectation) %>% 
  mutate(Hungry = exp(b_ExpectationHungry),
         Satiated = exp(b_ExpectationSatiated),
         diff_contrast = (Hungry - Satiated)) %>% 
  select(Hungry, Satiated, diff_contrast) %>% 
  pivot_longer(names_to = "Treatment", values_to = "Posterior_estimate", cols = 1:3) %>% 
  mutate(Predictor = "Allocated primer")

p8 <-
  peck_draws_expectation %>% 
  filter(Treatment != "diff_contrast") %>% 
  ggplot(aes(x = Treatment, y = Posterior_estimate)) + 
    stat_halfeye(aes(fill = Treatment), .width = c(0.66, 0.95), alpha = 0.9,
               point_interval = "median_qi", point_fill = "white",
               shape = 21, point_size = 4, stroke = 1.5) +
  scale_fill_manual(values = met.brewer("Hiroshige", 2)) +
  coord_flip(ylim = c(5, 20)) +
  #geom_vline(xintercept = 0, linetype = 2) +
  #scale_y_continuous(breaks = c(, 0, 1)) +
  xlab("Indicated expectation") +
  ylab("Estimated pecks per min") +
  theme_bw() + 
  theme(legend.position = "none",
        panel.grid.minor = element_blank(),
        text = element_text(size = 14))

p9 <-
  peck_draws_expectation %>% 
  filter(Treatment == "diff_contrast") %>% 
  ggplot(aes(y = Posterior_estimate)) + 
   stat_halfeye(aes(fill = Treatment), .width = c(0.66, 0.95), alpha = 0.9,
               point_interval = "median_qi", point_fill = "white",
               shape = 21, point_size = 4, stroke = 1.5) +
  scale_fill_manual(values = met.brewer("Hiroshige")[4]) +
  coord_flip(ylim = c(-5, 12)) +
  geom_hline(yintercept = 0, linetype = 2) +
  #scale_y_continuous(breaks = c(, 0, 1)) +
  xlab(NULL) +
  ylab("Hungry - Satiated difference\ncontrast (pecks per min)") +
  theme_bw() + 
  theme(legend.position = "none",
        panel.grid.minor = element_blank(),
        axis.text.y=element_blank(),
        axis.ticks.y=element_blank(),
        text = element_text(size = 14))

Plot

(p6 + p7) / (p8 + p9) +
   plot_annotation(tag_levels = 'a')

Figure 2. Posterior mean estimates and difference contrasts for observer estimated pigeon feeding rate. a shows the posterior means for observers that either received a primer that indicated satiated pigeons or one that indicated hungry pigeons. b shows the posterior difference between the mean estimates shown in a. c and d show the same posteriors as a and b except these are split by the indicated expectation of the observer’s, rather than those allocated to them. The coloured area is the posterior distribution and the black point is the mean estimate with associated 67% and 95% uncertainty intervals.

LS0tCnRpdGxlOiAnQW5pbWFsIGJlaGF2aW91cjogYmlhc2VkIHBpZ2VvbnMnCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICBkZXB0aDogMQogICAgbnVtYmVyX3NlY3Rpb25zOiBubwogICAgdGhlbWU6IHlldGkKICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6IHllcwogICAgY29kZV9kb3dubG9hZDogdHJ1ZQplZGl0b3Jfb3B0aW9uczoKICBjaHVua19vdXRwdXRfdHlwZTogY29uc29sZQotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCBjYWNoZSA9IEZBTFNFKQpgYGAKCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkgIyB0aWR5IHN0eWxlIGNvZGluZwpsaWJyYXJ5KGJybXMpICMgQmF5ZXNpYW4gbW9kZWxzCmxpYnJhcnkobG9vKSAjIGZvciBpbmZvcm1hdGlvbiBjcml0ZXJpYQpsaWJyYXJ5KHRpZHliYXllcykgIyBCYXllc2lhbiBhZXN0aGV0aWNzCmxpYnJhcnkoTWV0QnJld2VyKSAjIGNvbG91cnMKbGlicmFyeShrYWJsZUV4dHJhKSAjIHRhYmxlcwpsaWJyYXJ5KHBhdGNod29yaykgIyBwdXR0aW5nIHBsb3RzIHRvZ2V0aGVyCmxpYnJhcnkoRFQpICMgZm9yIHNlYXJjaC0gYW5kIHNhdmVhYmxlIHRhYmxlcwpsaWJyYXJ5KHBhbmRlcikgIyBmb3Igc2ltcGxlciB0YWJsZXMKYGBgCgojIExvYWQgaW4gdGhlIGRhdGEKCldlIGFuYWx5c2UgZGF0YSBjb2xsZWN0ZWQgYWNyb3NzIHRocmVlIGNvaG9ydHMgb2Ygc3R1ZGVudHMgKDIwMjEtMjAyMykgZW5yb2xsZWQgaW4gdGhlIHRoaXJkIHllYXIgU2Nob29sIG9mIEJpb3NjaWVuY2VzIHN1YmplY3QsIF9BbmltYWwgQmVoYXZpb3VyXywgYXQgVGhlIFVuaXZlcnNpdHkgb2YgTWVsYm91cm5lLiBXZSBoZXJlYWZ0ZXIgcmVmZXIgdG8gc3R1ZGVudHMgYXMgb2JzZXJ2ZXJzLgoKYGBge3J9CgpkYXRhIDwtIHJlYWRfY3N2KCJwaWdlb25fZGF0YS5jc3YiKSAlPiUgCiAgbXV0YXRlKFN0dWRlbnRfSUQgPSBhcy5mYWN0b3IoU3R1ZGVudF9JRCksCiAgICAgICAgIFllYXIgPSBhcy5mYWN0b3IoWWVhciksCiAgICAgICAgIEZvcmFnaW5nX3Byb3AgPSAoRm9yYWdpbmdfcGVyY2VudGFnZSAvIDEwMCkpICU+JQogIGZpbHRlcihZZWFyICVpbiUgYygiMjAyMSIsICIyMDIyIiwgIjIwMjMiKSwKICAgICAgICAgRm9yYWdpbmdfcGVyY2VudGFnZSAhPSAiTkEiLAogICAgICAgICBQcmltZXJfdW5kZXJzdG9vZCAhPSAiTkEiKSAlPiUKICBmaWx0ZXIoU3R1ZGVudF9JRCAhPSAiNjAiICYgU3R1ZGVudF9JRCAhPSAiNjgiICYgU3R1ZGVudF9JRCAhPSAiNzAiICYgU3R1ZGVudF9JRCAhPSAiNzIiKSAlPiUgIyByZW1vdmUgc3R1ZGVudHMgdGhhdCBjb21wbGV0ZWQgdGhlIHRhc2sgbXVsdGlwbGUgdGltZXMKICAjU3R1ZGVudF9JRCAlaW4lIGMoIjYwIiwgIjY4IiwgIjcwIiwgIjcyIikpICU+JSAKICBzZWxlY3QoLWMoRmlyc3RfbmFtZSwgU3VybmFtZSwgUGVja19tZWFuKSkgJT4lICAjIHJlbW92ZSBuYW1lcyB3aGVuIHJlYWR5CiAgcmVuYW1lKE9ic2VydmVyX0lEID0gU3R1ZGVudF9JRCkKCmRhdGFfcGVjayA8LSAKICBkYXRhICU+JQogIGZpbHRlcihQZWNrX3JhdGVfMiAhPSAiTkEiKSAlPiUgCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBQZWNrX3JhdGVfMTpQZWNrX3JhdGVfMiwgbmFtZXNfdG8gPSAiVHJpYWwiLAogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAiUGVja19yYXRlIikKICAKIyBDcmVhdGUgYSBmdW5jdGlvbiB0byBidWlsZCBIVE1MIHNlYXJjaGFibGUgdGFibGVzCgpteV9kYXRhX3RhYmxlIDwtIGZ1bmN0aW9uKGRmKXsKICBkYXRhdGFibGUoCiAgICBkZiwgcm93bmFtZXM9RkFMU0UsCiAgICBhdXRvSGlkZU5hdmlnYXRpb24gPSBUUlVFLAogICAgZXh0ZW5zaW9ucyA9IGMoIlNjcm9sbGVyIiwgICJCdXR0b25zIiksCiAgICBvcHRpb25zID0gbGlzdCgKICAgICAgZG9tID0gJ0JmcnRpcCcsCiAgICAgIGRlZmVyUmVuZGVyPVRSVUUsCiAgICAgIHNjcm9sbFg9VFJVRSwgc2Nyb2xsWT00MDAsCiAgICAgIHNjcm9sbENvbGxhcHNlPVRSVUUsCiAgICAgIGJ1dHRvbnMgPQogICAgICAgIGxpc3QoJ3BhZ2VMZW5ndGgnLCAnY29sdmlzJywgJ2NzdicsIGxpc3QoCiAgICAgICAgICBleHRlbmQgPSAncGRmJywKICAgICAgICAgIHBhZ2VTaXplID0gJ0E0JywKICAgICAgICAgIG9yaWVudGF0aW9uID0gJ2xhbmRzY2FwZScsCiAgICAgICAgICBmaWxlbmFtZSA9ICdmdWxsX2RhdGFzZXQnKSksCiAgICAgIHBhZ2VMZW5ndGggPSA3OAogICAgKQogICkKfQoKCm15X2RhdGFfdGFibGUoZGF0YSkKCmBgYAoKKipDb2x1bW4gZXhwbGFuYXRpb25zKioKCioqT2JzZXJ2ZXJfSUQqKjogdW5pcXVlLCBhbm9ueW1pc2VkIGlkZW50aWZpZXIgZm9yIGVhY2ggb2JzZXJ2ZXIuCgoqKlllYXIqKjogeWVhciB0aGF0IHRoZSBleHBlcmltZW50IHdhcyBjb25kdWN0ZWQKCioqQmlhc190cmVhdG1lbnQqKjogdGhlIHByaW1lciB0aGUgb2JzZXJ2ZXIgcmVjZWl2ZWQsIHdoZXJlICdzYXRpYXRlZCcgaW5kaWNhdGVzIHRoYXQgdGhlIG9ic2VydmVycyB3ZXJlIHByb3ZpZGVkIGluZm9ybWF0aW9uIHByaW9yIHRvIGEgdHJpYWwgdGhhdCBzdWdnZXN0ZWQgcGlnZW9ucyB3ZXJlIGZlbGwgZmVkLCB3aGVyZWFzICdodW5ncnknIGluZGljYXRlZCB0aGF0IHRoZSBwaWdlb25zIHdlcmUgaW4gcG9vciBjb25kaXRpb24gYW5kIGh1bmdyeS4KCioqRXhwZWN0YXRpb24qKjogd2UgYXNrZWQgdGhlIG9ic2VydmVycyB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZXkgdGhvdWdodCB0aGUgcGlnZW9ucyB3b3VsZCBiZSBodW5ncnkgb3Igc2F0aWF0ZWQuIFdlIGluY2x1ZGVkIHRoaXMgcXVlc3Rpb24gdG8gdGVzdCB3aGV0aGVyIG9ic2VydmVycyB3ZXJlIGFwcHJvcHJpYXRlbHkgcHJpbWVkIGJ5IHRoZWlyIGJpYXMgdHJlYXRtZW50LgoKKipQcmltZXJfdW5kZXJzdG9vZCoqOiBkaWQgdGhlIG9ic2VydmVyJ3MgZXhwZWN0YXRpb24gbWF0Y2ggdGhlIHByaW1lciB0aGV5IHJlY2VpdmVkPwoKKipGb3JhZ2luZ19wZXJjZW50YWdlKio6IHRoZSBwZXJjZW50YWdlIG9mIHBpZ2VvbnMgdGhhdCBvYnNlcnZlcnMgZXN0aW1hdGVkIHRvIGJlIGZvcmFnaW5nIG92ZXIgYSAxNSBzZWNvbmQgcGVyaW9kLCB3aGlsZSBvYnNlcnZpbmcgYSBsYXJnZSBmbG9jay4KCioqUGVja19yYXRlXzEqKjogdGhlIG51bWJlciBvZiB0aW1lcyBhIHNpbmdsZSBjaG9zZW4gcGlnZW9uIHBlY2tlZCB0aGUgZ3JvdW5kIG92ZXIgYSAxNSBzZWNvbmQgcGVyaW9kLgoKKipQZWNrX3JhdGVfMioqOiB0aGUgbnVtYmVyIG9mIHRpbWVzIGEgc2Vjb25kIGNob3NlbiBwaWdlb24gcGVja2VkIHRoZSBncm91bmQgb3ZlciBhIDE1IHNlY29uZCBwZXJpb2QuCgoqKkZvcmFnaW5nX3Byb3AqKjogcHJvcG9ydGlvbiBvZiBwaWdlb25zIGVzdGltYXRlZCB0byBiZSBmb3JhZ2luZyAKCiR+JAoKIyBRdWVzdGlvbiAxOiBpcyBlc3RpbWF0aW9uIG9mIGZvcmFnaW5nIHBlcmNlbnRhZ2UgYWZmZWN0ZWQgYnkgYmlhcyBtYW5pcHVsYXRpb25zPwoKJH4kCgojIyBUaGUgZnVsbCBtb2RlbAoKSGVyZSB3ZSBmaXQgYSBiZXRhIGRpc3RyaWJ1dGVkIG1vZGVsLCB3aXRoIHRoZSBwcm9wb3J0aW9uIG9mIHBpZ2VvbnMgZXN0aW1hdGVkIHRvIGJlIGZvcmFnaW5nIGFzIHRoZSByZXNwb25zZSB2YXJpYWJsZS4gV2UgaW5jbHVkZSBgQmlhc190cmVhdG1lbnRgIGFuZCBgUHJpbWVyX3VuZGVyc3Rvb2RgIGFzIGZpeGVkIGVmZmVjdHMgYXMgd2VsbCBhcyB0aGVpciB0d28td2F5IGludGVyYWN0aW9uLgoKYGBge3J9Cgpmb3JhZ2luZ19tb2RlbCA8LSBicm0oRm9yYWdpbmdfcHJvcCB+IDEgKyBCaWFzX3RyZWF0bWVudCAqIFByaW1lcl91bmRlcnN0b29kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLCBmYW1pbHkgPSBCZXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yID0gYyhwcmlvcihub3JtYWwoMCwgMSksIGNsYXNzID0gSW50ZXJjZXB0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEuNSksIGNsYXNzID0gYiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yKGV4cG9uZW50aWFsKDEpLCBjbGFzcyA9IHBoaSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXIgPSA2MDAwLCB3YXJtdXAgPSAyMDAwLCBjaGFpbnMgPSA0LCBjb3JlcyA9IDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGxpc3QoYWRhcHRfZGVsdGEgPSAwLjgsIG1heF90cmVlZGVwdGggPSAxMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VlZCA9IDEsIGZpbGUgPSAiZml0cy9mb3JhZ2luZ19tb2RlbCIpCgpmb3JhZ2luZ19tb2RlbAoKYGBgCgpUaGlzIG91dHB1dCBpcyBwcmV0dHkgdW5yZWFkYWJsZS4gVG8gbWFrZSBpbnRlcnByZXRhdGlvbiBlYXNpZXIsIHdlIGNhbiBwbG90IHByZWRpY3Rpb25zIGZyb20gdGhlIG1vZGVsLgoKJH4kCgoqKkNhbGN1bGF0ZSBwb3N0ZXJpb3IgbWVhbnMgYW5kIGRpZmZlcmVuY2UgY29udHJhc3RzKioKCkhlcmUgd2Ugc2FtcGxlIDQwMDAgZHJhd3MgZnJvbSB0aGUgcG9zdGVyaW9yIGRpc3RyaWJ1dGlvbiB0byBlc3RpbWF0ZSB0aGUgbWVhbiBmb3IgZWFjaCB0cmVhdG1lbnQgY29tYmluYXRpb24gaW4gb3VyIG1vZGVsLiBXaXRoIHRoZXNlIGRyYXdzIHdlIGNhbiBidWlsZCBhIGRpc3RyaWJ1dGlvbiBvZiB0aGUgbWVhbiBmb3IgZWFjaCByZWxldmFudCBjb21iaW5hdGlvbi4KClRoZSBmaXJzdCBjb3VwbGUgb2Ygcm93cyBhcmUgc2hvd24gYmVsb3c6CgpgYGB7cn0KCgpuZXdfZGF0YSA8LSBleHBhbmQuZ3JpZChCaWFzX3RyZWF0bWVudCA9IGMoIkh1bmdyeSIsICJTYXRpYXRlZCIpLAogICAgICAgICAgICAgICAgICAgICAgICAjWWVhciA9IGMoIjIwMjEiLCAiMjAyMiIsICIyMDIzIiksCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW1lcl91bmRlcnN0b29kID0gYygiWUVTIiwgIk5PIikpICU+JSAKICBhc190aWJibGUoKQoKZm9yYWdpbmdfcHJlZGljdGlvbnMgPC0gZml0dGVkKGZvcmFnaW5nX21vZGVsLCBuZXdfZGF0YSwgc3VtbWFyeSA9IEYpCgpmb3JhZ2luZ19wcmVkaWN0aW9uc19kcmF3cyA8LQogIGZvcmFnaW5nX3ByZWRpY3Rpb25zICU+JSAKICBhc190aWJibGUoKSAlPiUgCiAgcmVuYW1lKEh1bmdyeV9ZRVMgPSBWMSwKICAgICAgICAgU2F0aWF0ZWRfWUVTID0gVjIsCiAgICAgICAgIEh1bmdyeV9OTyA9IFYzLAogICAgICAgICBTYXRpYXRlZF9OTyA9IFY0KSAlPiUgCiAgcGl2b3RfbG9uZ2VyKG5hbWVzX3RvID0gIlByaW1lciIsIHZhbHVlc190byA9ICJFc3RpbWF0ZSIsIGNvbHMgPSAxOjQpICU+JQogIHNlcGFyYXRlKFByaW1lciwgCiAgICAgICAgICAgaW50byA9IGMoIlByaW1lciIsICJQcmltZXJfdW5kZXJzdG9vZCIpLCAKICAgICAgICAgICBzZXAgPSAiXyIpICU+JSAKICBtdXRhdGUoRXN0aW1hdGUgPSBFc3RpbWF0ZSAqMTAwLAogICAgICAgICBQcmltZXJfdW5kZXJzdG9vZCA9IGNhc2Vfd2hlbihQcmltZXJfdW5kZXJzdG9vZCA9PSAiTk8iIH4gIlByaW1lciB1bmRlcnN0b29kID0gTk8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmltZXJfdW5kZXJzdG9vZCA9PSAiWUVTIiB+ICJQcmltZXIgdW5kZXJzdG9vZCA9IFlFUyIpKSAKYGBgCgojIyBGaWd1cmUgUzEKCldlIGNhbiBwbG90IHRoZXNlIGRpc3RyaWJ1dGlvbnMgdXNpbmcgdGhlIGBzdGF0X2hhbGZleWVgIGdlb20gdGhhdCBjb21lcyB3aXRoIHRoZSBgdGlkeWJheWVzYCBwYWNrYWdlLgoKYGBge3J9CmZvcmFnaW5nX3ByZWRpY3Rpb25zX2RyYXdzICU+JSAKICAgZ2dwbG90KGFlcyh4ID0gRXN0aW1hdGUsIHkgPSBQcmltZXIsIGZpbGwgPSBQcmltZXIpKSArIAogIHN0YXRfaGFsZmV5ZShhZXMoZmlsbCA9IFByaW1lciksIC53aWR0aCA9IGMoMC42NiwgMC45NSksIGFscGhhID0gMC45LAogICAgICAgICAgICAgICBwb2ludF9pbnRlcnZhbCA9ICJtZWRpYW5fcWkiLCBwb2ludF9maWxsID0gIndoaXRlIiwKICAgICAgICAgICAgICAgc2hhcGUgPSAyMSwgcG9pbnRfc2l6ZSA9IDQsIHN0cm9rZSA9IDEuNSkgKyAjIHdpZHRoIGluZGljYXRlcyB0aGUgdW5jZXJ0YWludHkgaW50ZXJ2YWxzOiBoZXJlIHdlIGhhdmUgNjYlIGFuZCA5NSUgaW50ZXJ2YWxzCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gbWV0LmJyZXdlcigiSGlyb3NoaWdlIiwgMikpICsKICAjY29vcmRfZmxpcCgpICsKICAjZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAyKSArCiAgI3NjYWxlX3lfY29udGludW91cyhicmVha3MgPSBjKCwgMCwgMSkpICsKICB4bGFiKCJFc3RpbWF0ZWQgJSBwaWdlb25zIGZvcmFnaW5nIikgKwogIGZhY2V0X2dyaWQoflByaW1lcl91bmRlcnN0b29kKSArCiAgeWxhYigiUHJpbWVyIGRlbGl2ZXJlZCIpICsKICB0aGVtZV9idygpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpKQpgYGAKCioqRmlndXJlIFMxKiouIFBvc3RlcmlvciBtZWFucyBmb3IgZXN0aW1hdGVkIHByb3BvcnRpb25zIG9mIHBpZ2VvbnMgZm9yYWdpbmcuIE9ic2VydmVycyB3ZXJlIHByaW1lZCB3aXRoIG9uZSBvZiB0d28gZGlmZmVyZW50IHN0YXRlbWVudHMgdGhhdCBwcm92aWRlZCBpbmZvcm1hdGlvbiBvbiBwaWdlb24gY29uZGl0aW9uIC0gdGhleSBzdWdnZXN0ZWQgdGhhdCBwaWdlb25zIHdlcmUgZWl0aGVyIHNhdGlhdGVkIG9yIGh1bmdyeS4gVGhlIHBsb3QgaXMgc3BsaXQgaW50byBmb3VyOiBjb2x1bW5zIGluZGljYXRlIHRoZSB5ZWFyIG9mIG9ic2VydmF0aW9uLCB3aGlsZSByb3dzIHNwbGl0IHRoZSBlc3RpbWF0ZXMgYnkgd2hldGhlciB0aGUgb2JzZXJ2ZXIgZXhwZWN0YXRpb24gb2YgcGlnZW9uIGh1bmdlciBtYXRjaGVkIHRoZSBwcmltZXIgdGhleSByZWNlaXZlZC4gVGhlIGNvbG91cmVkIGFyZWEgaXMgdGhlIHBvc3RlcmlvciBkaXN0cmlidXRpb24gYW5kIHRoZSBibGFjayBwb2ludCBpcyB0aGUgbWVhbiBlc3RpbWF0ZSB3aXRoIGFzc29jaWF0ZWQgNjclIGFuZCA5NSUgdW5jZXJ0YWludHkgaW50ZXJ2YWxzLgoKJH4kCgoqKlRhYmxlIFMxKiouIFBvc3RlcmlvciBlc3RpbWF0ZXMgZm9yIHRoZSBwZXJjZW50YWdlcyBvZiBwaWdlb25zIGZvcmFnaW5nLCBicm9rZW4gaW50byB0aGUgZm91ciB0cmVhdG1lbnQgY29tYmluYXRpb25zLgoKYGBge3J9Cm5ld19kYXRhICU+JSAKY2JpbmQoZml0dGVkKGZvcmFnaW5nX21vZGVsLCBuZXdfZGF0YSwgc3VtbWFyeSA9IFQpICU+JQogICAgICAgIGFzX3RpYmJsZSgpICU+JSAKICAgICAgICBtdXRhdGUoYWNyb3NzKDE6NCwgfiAueCAqMTAwKSwKICAgICAgICAgICAgICAgYWNyb3NzKDE6NCwgcm91bmQsIDIpKSkgJT4lIAogIHBhbmRlcigpCgpgYGAKCiR+JAoKIyMgRXhwbG9yaW5nIGFsbG9jYXRpb24gdmVyc3VzIGV4cGVjdGF0aW9uIDEgey50YWJzZXQgLnRhYnNldC1waWxsc30KCiR+JAoKV2UgZmluZCB0aGF0ICoqMjIgb2YgdGhlIDc4IG9ic2VydmVycyoqIGluZGljYXRlZCBhIGZlZWRpbmcgbW90aXZhdGlvbiBleHBlY3RhdGlvbiBvcHBvc2l0ZSB0byB0aGF0IHN1Z2dlc3RlZCBieSB0aGUgcHJpbWVyIHRoZXkgd2VyZSBhbGxvY2F0ZWQuIAoKVGhlIG1vZGVsIGFib3ZlIGluZGljYXRlcyB0aGF0IGF0dGVudGlvbiBwYWlkIHRvIGFuZC9vciBjb21wcmVoZW5zaW9uIG9mIHRoZSBwcmltZXIgc3RhdGVtZW50IGhhcyBhIGxhcmdlIGVmZmVjdCBvbiBvYnNlcnZlcnMnIHBlcmNlcHRpb24gb2YgcGlnZW9uIGZvcmFnaW5nLiBUaGlzIHN1Z2dlc3RzIHRoYXQgYEV4cGVjdGF0aW9uYCBtYXkgYmUgYSBiZXR0ZXIgcHJlZGljdG9yIG9mIGZvcmFnaW5nIGVzdGltYXRpb24gdGhhbiBhbGxvY2F0ZWQgYEJpYXNfdHJlYXRtZW50YC4KCldlIGV4cGxvcmUgdGhpcyBiZWxvdyBieSBmaXR0aW5nIHR3byBtb2RlbHM6CgoxLiBhIG1vZGVsIHdpdGggYWxsb2NhdGVkIHByaW1lciAoYEJpYXNfdHJlYXRtZW50YCkgYXMgdGhlIHByZWRpY3RvciB2YXJpYWJsZSAKCjIuIGEgbW9kZWwgd2l0aCBpbmRpY2F0ZWQgaHVuZ2VyIGV4cGVjdGF0aW9uIChgRXhwZWN0YXRpb25gKSBhcyB0aGUgcHJlZGljdG9yIHZhcmlhYmxlCgokfiQKCiMjIyBNb2RlbCAxOiBhbGxvY2F0ZWQgcHJpbWVyCgpgYGB7cn0KCiMgRmlyc3QgbGV0J3MgbW9kZWwgdGhlIGVmZmVjdCBvZiBiaWFzIHRyZWF0bWVudCBvbiBmb3JhZ2luZyBlc3RpbWF0aW9uIAoKZm9yYWdpbmdfbW9kZWxfdHJlYXRtZW50IDwtIGJybShGb3JhZ2luZ19wcm9wIH4gMCArIEJpYXNfdHJlYXRtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEsIGZhbWlseSA9IEJldGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvciA9IGMocHJpb3Iobm9ybWFsKDAsIDEuNSksIGNsYXNzID0gYiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3IoZXhwb25lbnRpYWwoMSksIGNsYXNzID0gcGhpKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyID0gNjAwMCwgd2FybXVwID0gMjAwMCwgY2hhaW5zID0gNCwgY29yZXMgPSA0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGxpc3QoYWRhcHRfZGVsdGEgPSAwLjgsIG1heF90cmVlZGVwdGggPSAxMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWVkID0gMSwgZmlsZSA9ICJmaXRzL2ZvcmFnaW5nX21vZGVsX3RyZWF0bWVudCIpCgpmb3JhZ2luZ19tb2RlbF90cmVhdG1lbnQgPC0gYWRkX2NyaXRlcmlvbihmb3JhZ2luZ19tb2RlbF90cmVhdG1lbnQsIGNyaXRlcmlvbiA9ICJsb28iLCBmaWxlID0gImZpdHMvZm9yYWdpbmdfbW9kZWxfdHJlYXRtZW50IikKCmBgYAoKKipUYWJsZSBTMioqLiBQb3N0ZXJpb3IgZXN0aW1hdGVzIG9mIHRoZSBwZXJjZW50YWdlIG9mIHBpZ2VvbiBmZWVkaW5nIHJhdGUsIHNwbGl0IGJ5IHRoZSBwcmltZXIgb2JzZXJ2ZXJzIHdlcmUgYWxsb2NhdGVkLgoKYGBge3J9Cm5ld19kYXRhXzIgPC0gdGliYmxlKEJpYXNfdHJlYXRtZW50ID0gYygiSHVuZ3J5IiwgIlNhdGlhdGVkIikpCgpuZXdfZGF0YV8yICU+JSAKICBjYmluZChmaXR0ZWQoZm9yYWdpbmdfbW9kZWxfdHJlYXRtZW50LCBuZXdkYXRhID0gbmV3X2RhdGFfMiwgc3VtbWFyeSA9IFQpICU+JSAKICAgICAgICAgIGFzX3RpYmJsZSgpICU+JSAKICAgICAgICAgIG11dGF0ZShhY3Jvc3MoMTo0LCB+IC54ICoxMDApLAogICAgICAgICAgICAgICAgIGFjcm9zcygxOjQsIHJvdW5kLCAyKSkpICU+JSAKICByZW5hbWUoIkVzdGltYXRlZCBwcm9wb3J0aW9uIGZvcmFnaW5nIiA9IEVzdGltYXRlLAogICAgICAgICAiQmlhcyB0cmVhdG1lbnQiID0gQmlhc190cmVhdG1lbnQpICU+JSAKICBwYW5kZXIoKQpgYGAKCgojIyMgTW9kZWwgMjogaW5kaWNhdGVkIGV4cGVjdGF0aW9uCgpgYGB7cn0KCiMgZml0IHRoZSBzYW1lIG1vZGVsLCBleGNlcHQgdXNpbmcgcGFydGljaXBhbnQgZXhwZWN0YXRpb24gcmF0aGVyIHRoYW4gYWxsb2NhdGVkIGJpYXMgdHJlYXRtZW50Cgpmb3JhZ2luZ19tb2RlbF9leHBlY3RhdGlvbiA8LSBicm0oRm9yYWdpbmdfcHJvcCB+IDAgKyBFeHBlY3RhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLCBmYW1pbHkgPSBCZXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3IgPSBjKHByaW9yKG5vcm1hbCgwLCAxLjUpLCBjbGFzcyA9IGIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yKGV4cG9uZW50aWFsKDEpLCBjbGFzcyA9IHBoaSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlciA9IDYwMDAsIHdhcm11cCA9IDIwMDAsIGNoYWlucyA9IDQsIGNvcmVzID0gNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBsaXN0KGFkYXB0X2RlbHRhID0gMC44LCBtYXhfdHJlZWRlcHRoID0gMTApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VlZCA9IDEsIGZpbGUgPSAiZml0cy9mb3JhZ2luZ19tb2RlbF9leHBlY3RhdGlvbiIpCgpmb3JhZ2luZ19tb2RlbF9leHBlY3RhdGlvbiA8LSBhZGRfY3JpdGVyaW9uKGZvcmFnaW5nX21vZGVsX2V4cGVjdGF0aW9uLCBjcml0ZXJpb24gPSAibG9vIiwgZmlsZSA9ICJmaXRzL2ZvcmFnaW5nX21vZGVsX2V4cGVjdGF0aW9uIikKCiNsb29fY29tcGFyZShmb3JhZ2luZ19tb2RlbF90cmVhdG1lbnQsIGZvcmFnaW5nX21vZGVsX2V4cGVjdGF0aW9uKQpgYGAKCioqVGFibGUgUzMqKi4gUG9zdGVyaW9yIGVzdGltYXRlcyBvZiB0aGUgcGVyY2VudGFnZSBvZiBwaWdlb25zIGZvcmFnaW5nLCBzcGxpdCBieSB0aGUgYWN0dWFsIGV4cGVjdGF0aW9uIG9mIG9ic2VydmVycy4KCmBgYHtyfQoKbmV3X2RhdGFfMyA8LSB0aWJibGUoRXhwZWN0YXRpb24gPSBjKCJIdW5ncnkiLCAiU2F0aWF0ZWQiKSkKCm5ld19kYXRhXzMgJT4lIAogIGNiaW5kKGZpdHRlZChmb3JhZ2luZ19tb2RlbF9leHBlY3RhdGlvbiwgbmV3ZGF0YSA9IG5ld19kYXRhXzMsIHN1bW1hcnkgPSBUKSAlPiUgCiAgICAgICAgICBhc190aWJibGUoKSAlPiUgCiAgICAgICAgICBtdXRhdGUoYWNyb3NzKDE6NCwgfiAueCAqMTAwKSwKICAgICAgICAgICAgICAgICBhY3Jvc3MoMTo0LCByb3VuZCwgMikpKSAlPiUgIAogIHJlbmFtZSgiRXN0aW1hdGVkIHByb3BvcnRpb24gZm9yYWdpbmciID0gRXN0aW1hdGUsCiAgICAgICAgICJJbmRpY2F0ZWQgZXhwZWN0YXRpb24iID0gRXhwZWN0YXRpb24pICU+JSAKICBwYW5kZXIoKQpgYGAKCiR+JAoKIyMgRmlndXJlIDEKCiR+JAoKKipHZXQgcG9zdGVyaW9yIG1lYW5zIGFuZCBkaWZmZXJlbmNlIGNvbnRyYXN0cyoqCgpgYGB7cn0KCiMgdHJlYXRtZW50IG1vZGVsCgpkcmF3c190cmVhdG1lbnQgPC0KICBhc19kcmF3c19kZihmb3JhZ2luZ19tb2RlbF90cmVhdG1lbnQpICU+JSAKICBtdXRhdGUoSHVuZ3J5ID0gaW52X2xvZ2l0X3NjYWxlZChiX0JpYXNfdHJlYXRtZW50SHVuZ3J5KSAqMTAwLAogICAgICAgICBTYXRpYXRlZCA9IGludl9sb2dpdF9zY2FsZWQoYl9CaWFzX3RyZWF0bWVudFNhdGlhdGVkKSoxMDAsCiAgICAgICAgIGRpZmZfY29udHJhc3QgPSAoSHVuZ3J5IC0gU2F0aWF0ZWQpKSAlPiUgCiAgc2VsZWN0KEh1bmdyeSwgU2F0aWF0ZWQsIGRpZmZfY29udHJhc3QpICU+JSAKICBwaXZvdF9sb25nZXIobmFtZXNfdG8gPSAiVHJlYXRtZW50IiwgdmFsdWVzX3RvID0gIlBvc3Rlcmlvcl9lc3RpbWF0ZSIsIGNvbHMgPSAxOjMpICU+JSAKICBtdXRhdGUoUHJlZGljdG9yID0gIkFsbG9jYXRlZCBwcmltZXIiKQoKcDIgPC0gCiAgZHJhd3NfdHJlYXRtZW50ICU+JSAKICBmaWx0ZXIoVHJlYXRtZW50ICE9ICJkaWZmX2NvbnRyYXN0IikgJT4lIAogIGdncGxvdChhZXMoeCA9IFRyZWF0bWVudCwgeSA9IFBvc3Rlcmlvcl9lc3RpbWF0ZSkpICsgCiAgc3RhdF9oYWxmZXllKGFlcyhmaWxsID0gVHJlYXRtZW50KSwgLndpZHRoID0gYygwLjY2LCAwLjk1KSwgYWxwaGEgPSAwLjksCiAgICAgICAgICAgICAgIHBvaW50X2ludGVydmFsID0gIm1lZGlhbl9xaSIsIHBvaW50X2ZpbGwgPSAid2hpdGUiLAogICAgICAgICAgICAgICBzaGFwZSA9IDIxLCBwb2ludF9zaXplID0gNCwgc3Ryb2tlID0gMS41KSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gbWV0LmJyZXdlcigiSGlyb3NoaWdlIiwgMikpICsKICBjb29yZF9mbGlwKHlsaW0gPSBjKDI1LCA1NSkpICsKICAjZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAyKSArCiAgI3NjYWxlX3lfY29udGludW91cyhicmVha3MgPSBjKCwgMCwgMSkpICsKICB4bGFiKCJBbGxvY2F0ZWQgcHJpbWVyIikgKwogIHlsYWIoIkVzdGltYXRlZCAlIHBpZ2VvbnMgZm9yYWdpbmciKSArCiAgdGhlbWVfYncoKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSkKCnAzIDwtCiAgZHJhd3NfdHJlYXRtZW50ICU+JSAKICBmaWx0ZXIoVHJlYXRtZW50ID09ICJkaWZmX2NvbnRyYXN0IikgJT4lIAogIGdncGxvdChhZXMoeSA9IFBvc3Rlcmlvcl9lc3RpbWF0ZSkpICsgCiAgIHN0YXRfaGFsZmV5ZShhZXMoZmlsbCA9IFRyZWF0bWVudCksIC53aWR0aCA9IGMoMC42NiwgMC45NSksIGFscGhhID0gMC45LAogICAgICAgICAgICAgICBwb2ludF9pbnRlcnZhbCA9ICJtZWRpYW5fcWkiLCBwb2ludF9maWxsID0gIndoaXRlIiwKICAgICAgICAgICAgICAgc2hhcGUgPSAyMSwgcG9pbnRfc2l6ZSA9IDQsIHN0cm9rZSA9IDEuNSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IG1ldC5icmV3ZXIoIkhpcm9zaGlnZSIpWzRdKSArCiAgY29vcmRfZmxpcCh5bGltID0gYygtMjAsIDIwKSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gMikgKwogICNzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gYygsIDAsIDEpKSArCiAgeGxhYihOVUxMKSArCiAgeWxhYigiSHVuZ3J5IC0gU2F0aWF0ZWQgZGlmZmVyZW5jZVxuY29udHJhc3QgKCUgcG9pbnRzKSIpICsKICB0aGVtZV9idygpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0Lnk9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MueT1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpKQoKIyBleHBlY3RhdGlvbiBtb2RlbAoKZHJhd3NfZXhwZWN0YXRpb24gPC0KICBhc19kcmF3c19kZihmb3JhZ2luZ19tb2RlbF9leHBlY3RhdGlvbikgJT4lIAogIG11dGF0ZShIdW5ncnkgPSBpbnZfbG9naXRfc2NhbGVkKGJfRXhwZWN0YXRpb25IdW5ncnkpICoxMDAsCiAgICAgICAgIFNhdGlhdGVkID0gaW52X2xvZ2l0X3NjYWxlZChiX0V4cGVjdGF0aW9uU2F0aWF0ZWQpKjEwMCwKICAgICAgICAgZGlmZl9jb250cmFzdCA9IChIdW5ncnkgLSBTYXRpYXRlZCkpICU+JSAKICBzZWxlY3QoSHVuZ3J5LCBTYXRpYXRlZCwgZGlmZl9jb250cmFzdCkgJT4lIAogIHBpdm90X2xvbmdlcihuYW1lc190byA9ICJUcmVhdG1lbnQiLCB2YWx1ZXNfdG8gPSAiUG9zdGVyaW9yX2VzdGltYXRlIiwgY29scyA9IDE6MykgJT4lIAogIG11dGF0ZShQcmVkaWN0b3IgPSAiSW5kaWNhdGVkIGV4cGVjdGF0aW9uIikKCnA0IDwtCiAgZHJhd3NfZXhwZWN0YXRpb24gJT4lIAogIGZpbHRlcihUcmVhdG1lbnQgIT0gImRpZmZfY29udHJhc3QiKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gVHJlYXRtZW50LCB5ID0gUG9zdGVyaW9yX2VzdGltYXRlKSkgKyAKICAgc3RhdF9oYWxmZXllKGFlcyhmaWxsID0gVHJlYXRtZW50KSwgLndpZHRoID0gYygwLjY2LCAwLjk1KSwgYWxwaGEgPSAwLjksCiAgICAgICAgICAgICAgIHBvaW50X2ludGVydmFsID0gIm1lZGlhbl9xaSIsIHBvaW50X2ZpbGwgPSAid2hpdGUiLAogICAgICAgICAgICAgICBzaGFwZSA9IDIxLCBwb2ludF9zaXplID0gNCwgc3Ryb2tlID0gMS41KSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gbWV0LmJyZXdlcigiSGlyb3NoaWdlIiwgMikpICsKICBjb29yZF9mbGlwKHlsaW0gPSBjKDI1LCA1NSkpICsKICAjZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAyKSArCiAgI3NjYWxlX3lfY29udGludW91cyhicmVha3MgPSBjKCwgMCwgMSkpICsKICB4bGFiKCJJbmRpY2F0ZWQgZXhwZWN0YXRpb24iKSArCiAgeWxhYigiRXN0aW1hdGVkICUgcGlnZW9ucyBmb3JhZ2luZyIpICsKICB0aGVtZV9idygpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpKQoKcDUgPC0KICBkcmF3c19leHBlY3RhdGlvbiAlPiUgCiAgZmlsdGVyKFRyZWF0bWVudCA9PSAiZGlmZl9jb250cmFzdCIpICU+JSAKICBnZ3Bsb3QoYWVzKHkgPSBQb3N0ZXJpb3JfZXN0aW1hdGUpKSArIAogICAgc3RhdF9oYWxmZXllKGFlcyhmaWxsID0gVHJlYXRtZW50KSwgLndpZHRoID0gYygwLjY2LCAwLjk1KSwgYWxwaGEgPSAwLjksCiAgICAgICAgICAgICAgIHBvaW50X2ludGVydmFsID0gIm1lZGlhbl9xaSIsIHBvaW50X2ZpbGwgPSAid2hpdGUiLAogICAgICAgICAgICAgICBzaGFwZSA9IDIxLCBwb2ludF9zaXplID0gNCwgc3Ryb2tlID0gMS41KSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gbWV0LmJyZXdlcigiSGlyb3NoaWdlIilbNF0pICsKICBjb29yZF9mbGlwKHlsaW0gPSBjKC0yMCwgMjApKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAyKSArCiAgI3NjYWxlX3lfY29udGludW91cyhicmVha3MgPSBjKCwgMCwgMSkpICsKICB4bGFiKE5VTEwpICsKICB5bGFiKCJIdW5ncnkgLSBTYXRpYXRlZCBkaWZmZXJlbmNlXG5jb250cmFzdCAoJSBwb2ludHMpIikgKwogIHRoZW1lX2J3KCkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQueT1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcy55PWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCkpCmBgYAoKUGxvdAoKYGBge3IsIGZpZy5oZWlnaHQ9OH0KKHAyICsgcDMpIC8gKHA0ICsgcDUpICsKICAgcGxvdF9hbm5vdGF0aW9uKHRhZ19sZXZlbHMgPSAnYScpCmBgYAoKKipGaWd1cmUgMSoqLiBQb3N0ZXJpb3IgbWVhbiBlc3RpbWF0ZXMgYW5kIGRpZmZlcmVuY2UgY29udHJhc3RzIGZvciBvYnNlcnZlciBlc3RpbWF0ZWQgcGlnZW9uIGZvcmFnaW5nLiAqKmEqKiBzaG93cyB0aGUgcG9zdGVyaW9yIG1lYW5zIGZvciBvYnNlcnZlcnMgdGhhdCBlaXRoZXIgcmVjZWl2ZWQgYSBwcmltZXIgdGhhdCBpbmRpY2F0ZWQgc2F0aWF0ZWQgcGlnZW9ucyBvciBvbmUgdGhhdCBpbmRpY2F0ZWQgaHVuZ3J5IHBpZ2VvbnMuICoqYioqIHNob3dzIHRoZSBwb3N0ZXJpb3IgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBtZWFuIGVzdGltYXRlcyBzaG93biBpbiAqKmEqKi4gKipjKiogYW5kICoqZCoqIHNob3cgdGhlIHNhbWUgcG9zdGVyaW9ycyBhcyAqKmEqKiBhbmQgKipiKiogZXhjZXB0IHRoZXNlIGFyZSBzcGxpdCBieSB0aGUgaW5kaWNhdGVkIGV4cGVjdGF0aW9uIG9mIHRoZSBvYnNlcnZlcidzLCByYXRoZXIgdGhhbiB0aG9zZSBhbGxvY2F0ZWQgdG8gdGhlbS4gVGhlIGNvbG91cmVkIGFyZWEgaXMgdGhlIHBvc3RlcmlvciBkaXN0cmlidXRpb24gYW5kIHRoZSBibGFjayBwb2ludCBpcyB0aGUgbWVhbiBlc3RpbWF0ZSB3aXRoIGFzc29jaWF0ZWQgNjclIGFuZCA5NSUgdW5jZXJ0YWludHkgaW50ZXJ2YWxzLgoKJH4kCgojIFF1ZXN0aW9uIDI6IGlzIGVzdGltYXRpb24gb2YgZmVlZGluZyByYXRlIGFmZmVjdGVkIGJ5IGJpYXMgbWFuaXB1bGF0aW9ucz8KCldlIGFza2VkIG9ic2VydmVycyB0byBjb3VudCB0aGUgbnVtYmVyIG9mIHBlY2tzIG9mIHRoZSBncm91bmQgdGhhdCBhIHNlbGVjdGVkIHBpZ2VvbiBtYWRlIG92ZXIgYSAxIG1pbnV0ZSBwZXJpb2QuIFdlIHVzZSB0aGUgbnVtYmVyIG9mIHBlY2tzIHRoYXQgb2NjdXIgYXMgYSBtZWFzdXJlIG9mIGZlZWRpbmcgcmF0ZS4KCmBgYHtyfQoKcGVja19yYXRlX21vZGVsIDwtIGJybShQZWNrX3JhdGUgfiAxICsgQmlhc190cmVhdG1lbnQgKiBQcmltZXJfdW5kZXJzdG9vZCArICgxfE9ic2VydmVyX0lEKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YV9wZWNrLCBmYW1pbHkgPSBuZWdiaW5vbWlhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvciA9IGMoIHByaW9yKG5vcm1hbCgwLCAxLjUpLCBjbGFzcyA9IEludGVyY2VwdCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxLjUpLCBjbGFzcyA9IGIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvcihleHBvbmVudGlhbCgxKSwgY2xhc3MgPSBzZCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXIgPSA2MDAwLCB3YXJtdXAgPSAyMDAwLCBjaGFpbnMgPSA0LCBjb3JlcyA9IDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGxpc3QoYWRhcHRfZGVsdGEgPSAwLjksIG1heF90cmVlZGVwdGggPSAxMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VlZCA9IDEsIGZpbGUgPSAiZml0cy9wZWNrX3JhdGVfbW9kZWwiKQoKcGVja19yYXRlX21vZGVsCgpgYGAKCkFub3RoZXIgdW5yZWFkYWJsZSBvdXRwdXQgTGV0J3MgbG9vayBhdCB0aGUgbW9kZWwgcHJlZGljdGlvbnMgYWdhaW4uCgokfiQKCioqQ2FsY3VsYXRlIHBvc3RlcmlvciBtZWFucyBhbmQgZGlmZmVyZW5jZSBjb250cmFzdHMqKgoKYGBge3J9CgoKbmV3X2RhdGEgPC0gZXhwYW5kLmdyaWQoQmlhc190cmVhdG1lbnQgPSBjKCJIdW5ncnkiLCAiU2F0aWF0ZWQiKSwKICAgICAgICAgICAgICAgICAgICAgICAgI1llYXIgPSBjKCIyMDIxIiwgIjIwMjIiKSwKICAgICAgICAgICAgICAgICAgICAgICAgUHJpbWVyX3VuZGVyc3Rvb2QgPSBjKCJZRVMiLCAiTk8iKSkgJT4lIAogIGFzX3RpYmJsZSgpCgpwZWNrX3ByZWRpY3Rpb25zIDwtIGZpdHRlZChwZWNrX3JhdGVfbW9kZWwsIG5ld19kYXRhLCBzdW1tYXJ5ID0gRiwgcmVfZm9ybXVsYSA9IE5BKQogIApwZWNrX3ByZWRpY3Rpb25zX2RyYXdzIDwtCiAgcGVja19wcmVkaWN0aW9ucyAlPiUgCiAgYXNfdGliYmxlKCkgJT4lIAogIHJlbmFtZShIdW5ncnlfWUVTID0gVjEsCiAgICAgICAgIFNhdGlhdGVkX1lFUyA9IFYyLAogICAgICAgICBIdW5ncnlfTk8gPSBWMywKICAgICAgICAgU2F0aWF0ZWRfTk8gPSBWNCkgJT4lIAogIHBpdm90X2xvbmdlcihuYW1lc190byA9ICJQcmltZXIiLCB2YWx1ZXNfdG8gPSAiRXN0aW1hdGUiLCBjb2xzID0gMTo0KSAlPiUKICBzZXBhcmF0ZShQcmltZXIsIAogICAgICAgICAgIGludG8gPSBjKCJQcmltZXIiLCAiUHJpbWVyX3VuZGVyc3Rvb2QiKSwgCiAgICAgICAgICAgc2VwID0gIl8iKSAlPiUgCiAgICBtdXRhdGUoUHJpbWVyX3VuZGVyc3Rvb2QgPSBjYXNlX3doZW4oUHJpbWVyX3VuZGVyc3Rvb2QgPT0gIk5PIiB+ICJQcmltZXIgdW5kZXJzdG9vZCA9IE5PIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbWVyX3VuZGVyc3Rvb2QgPT0gIllFUyIgfiAiUHJpbWVyIHVuZGVyc3Rvb2QgPSBZRVMiKSkgCgpgYGAKCiR+JAoKIyMgRmlndXJlIFMyCgpgYGB7cn0KcGVja19wcmVkaWN0aW9uc19kcmF3cyAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gRXN0aW1hdGUsIHkgPSBQcmltZXIsIGZpbGwgPSBQcmltZXIpKSArIAogIHN0YXRfaGFsZmV5ZShhZXMoZmlsbCA9IFByaW1lciksIC53aWR0aCA9IGMoMC42NiwgMC45NSksIGFscGhhID0gMC45LAogICAgICAgICAgICAgICBwb2ludF9pbnRlcnZhbCA9ICJtZWRpYW5fcWkiLCBwb2ludF9maWxsID0gIndoaXRlIiwKICAgICAgICAgICAgICAgc2hhcGUgPSAyMSwgcG9pbnRfc2l6ZSA9IDQsIHN0cm9rZSA9IDEuNSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IG1ldC5icmV3ZXIoIkhpcm9zaGlnZSIsIDIpKSArCiAgY29vcmRfY2FydGVzaWFuKHhsaW0gPSBjKDAsIDIwKSkgKwogICNnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9IDIpICsKICAjc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IGMoLCAwLCAxKSkgKwogIHhsYWIoIkVzdGltYXRlZCBwZWNrIHJhdGUiKSArCiAgZmFjZXRfZ3JpZCh+UHJpbWVyX3VuZGVyc3Rvb2QpICsKICB5bGFiKCJBbGxvY2F0ZWQgcHJpbWVyIikgKwogIHRoZW1lX2J3KCkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNikpCmBgYAoKKipGaWd1cmUgUzIqKi4gUG9zdGVyaW9yIG1lYW5zIGZvciBvYnNlcnZlciBlc3RpbWF0ZWQgcGlnZW9uIGZlZWRpbmcgcmF0ZS4gT2JzZXJ2ZXJzIHdlcmUgcHJpbWVkIHdpdGggb25lIG9mIHR3byBkaWZmZXJlbnQgc3RhdGVtZW50cyB0aGF0IHByb3ZpZGVkIGluZm9ybWF0aW9uIG9uIHBpZ2VvbiBjb25kaXRpb24gLSB0aGV5IHN1Z2dlc3RlZCB0aGF0IHBpZ2VvbnMgd2VyZSBlaXRoZXIgc2F0aWF0ZWQgb3IgaHVuZ3J5LiBUaGUgcGxvdCBpcyBzcGxpdCBpbnRvIGZvdXI6IGNvbHVtbnMgaW5kaWNhdGUgdGhlIHllYXIgb2Ygb2JzZXJ2YXRpb24sIHdoaWxlIHJvd3Mgc3BsaXQgdGhlIGVzdGltYXRlcyBieSB3aGV0aGVyIHRoZSBvYnNlcnZlciBleHBlY3RhdGlvbiBvZiBwaWdlb24gaHVuZ2VyIG1hdGNoZWQgdGhlIHByaW1lciB0aGV5IHJlY2VpdmVkLiBUaGUgY29sb3VyZWQgYXJlYSBpcyB0aGUgcG9zdGVyaW9yIGRpc3RyaWJ1dGlvbiBhbmQgdGhlIGJsYWNrIHBvaW50IGlzIHRoZSBtZWFuIGVzdGltYXRlIHdpdGggYXNzb2NpYXRlZCA2NyUgYW5kIDk1JSB1bmNlcnRhaW50eSBpbnRlcnZhbHMuCgokfiQKCioqVGFibGUgUzQqKi4gUG9zdGVyaW9yIGVzdGltYXRlcyBvZiBwaWdlb24gZmVlZGluZyByYXRlLCBicm9rZW4gaW50byB0aGUgZm91ciB0cmVhdG1lbnQgY29tYmluYXRpb25zLiAKCmBgYHtyfQpuZXdfZGF0YSAlPiUgCmNiaW5kKGZpdHRlZChwZWNrX3JhdGVfbW9kZWwsIG5ld19kYXRhLCBzdW1tYXJ5ID0gVCwgcmVfZm9ybXVsYSA9IE5BKSAlPiUKICAgICAgICBhc190aWJibGUoKSAlPiUgCiAgICAgICAgbXV0YXRlKGFjcm9zcygxOjQsIHJvdW5kLCAyKSkpICU+JSAKICBwYW5kZXIoKQoKYGBgCgoKJH4kCgojIyBFeHBsb3JpbmcgYWxsb2NhdGlvbiB2ZXJzdXMgZXhwZWN0YXRpb24gMi4wIHsudGFic2V0IC50YWJzZXQtcGlsbHN9CgokfiQKCk9uY2UgYWdhaW4sIHdlIGZpbmQgdGhhdCBhdHRlbnRpb24gcGFpZCB0byBhbmQvb3IgY29tcHJlaGVuc2lvbiBvZiB0aGUgcHJpbWVyIHN0YXRlbWVudCBoYXMgYSBsYXJnZSBlZmZlY3Qgb24gb2JzZXJ2ZXJzJyBwZXJjZXB0aW9uIG9mIHBpZ2VvbiBmb3JhZ2luZy4gCgpMZXRzIGFnYWluIGZpdCBvdXIgdHdvIG1vZGVsczoKCjEuIGEgbW9kZWwgd2l0aCBhbGxvY2F0ZWQgcHJpbWVyIChgQmlhc190cmVhdG1lbnRgKSBhcyB0aGUgcHJlZGljdG9yIHZhcmlhYmxlIAoKMi4gYSBtb2RlbCB3aXRoIGluZGljYXRlZCBodW5nZXIgZXhwZWN0YXRpb24gKGBFeHBlY3RhdGlvbmApIGFzIHRoZSBwcmVkaWN0b3IgdmFyaWFibGUKCiR+JAoKIyMjIE1vZGVsIDE6IGFsbG9jYXRlZCBwcmltZXIKCmBgYHtyfQoKIyBGaXJzdCBsZXQncyBtb2RlbCB0aGUgZWZmZWN0IG9mIGJpYXMgdHJlYXRtZW50IG9uIHBlY2sgcmF0ZQoKcGVja19tb2RlbF90cmVhdG1lbnQgPC0gYnJtKFBlY2tfcmF0ZSB+IDAgKyBCaWFzX3RyZWF0bWVudCArICgxfE9ic2VydmVyX0lEKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhX3BlY2ssIGZhbWlseSA9IG5lZ2Jpbm9taWFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3IgPSBjKHByaW9yKG5vcm1hbCgwLCAxLjUpLCBjbGFzcyA9IGIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yKGV4cG9uZW50aWFsKDEpLCBjbGFzcyA9IHNkKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyID0gNjAwMCwgd2FybXVwID0gMjAwMCwgY2hhaW5zID0gNCwgY29yZXMgPSA0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGxpc3QoYWRhcHRfZGVsdGEgPSAwLjksIG1heF90cmVlZGVwdGggPSAxMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWVkID0gMSwgZmlsZSA9ICJmaXRzL3BlY2tfbW9kZWxfdHJlYXRtZW50IikKCnBlY2tfbW9kZWxfdHJlYXRtZW50IDwtIGFkZF9jcml0ZXJpb24ocGVja19tb2RlbF90cmVhdG1lbnQsIGNyaXRlcmlvbiA9ICJsb28iLCBmaWxlID0gImZpdHMvcGVja19tb2RlbF90cmVhdG1lbnQiKQogIApwZWNrX21vZGVsX3RyZWF0bWVudApgYGAKCioqVGFibGUgUzUqKi4gVGhlIGVzdGltYXRlZCBwZWNrIHJhdGUgb2YgZm9yYWdpbmcgcGlnZW9ucywgc3BsaXQgYnkgdGhlIHByaW1lciBvYnNlcnZlcnMgd2VyZSBhbGxvY2F0ZWQuCgpgYGB7cn0KbmV3X2RhdGFfMiAlPiUgCiAgY2JpbmQoZml0dGVkKHBlY2tfbW9kZWxfdHJlYXRtZW50LCBuZXdkYXRhID0gbmV3X2RhdGFfMiwgc3VtbWFyeSA9IFQsIHJlX2Zvcm11bGEgPSBOQSkgJT4lIAogICAgICAgICAgYXNfdGliYmxlKCkgJT4lIAogICAgICAgICAgbXV0YXRlKGFjcm9zcygxOjQsIHJvdW5kLCAyKSkpICU+JSAKICByZW5hbWUoIkVzdGltYXRlZCBwZWNrIHJhdGUiID0gRXN0aW1hdGUsCiAgICAgICAgICJCaWFzIHRyZWF0bWVudCIgPSBCaWFzX3RyZWF0bWVudCkgJT4lIAogIHBhbmRlcigpCmBgYAoKIyMjIE1vZGVsIDI6IEluZGljYXRlZCBleHBlY3RhdGlvbgoKYGBge3J9CgojIGZpdCB0aGUgc2FtZSBtb2RlbCwgZXhjZXB0IHVzaW5nIHBhcnRpY2lwYW50IGV4cGVjdGF0aW9uIHJhdGhlciB0aGFuIGFsbG9jYXRlZCBiaWFzIHRyZWF0bWVudAoKcGVja19tb2RlbF9leHBlY3RhdGlvbiA8LSBicm0oUGVja19yYXRlIH4gMCArIEV4cGVjdGF0aW9uICsgKDF8T2JzZXJ2ZXJfSUQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGFfcGVjaywgZmFtaWx5ID0gbmVnYmlub21pYWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvciA9IGMocHJpb3Iobm9ybWFsKDAsIDEuNSksIGNsYXNzID0gYiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3IoZXhwb25lbnRpYWwoMSksIGNsYXNzID0gc2QpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXIgPSA0MDAwLCB3YXJtdXAgPSAyMDAwLCBjaGFpbnMgPSA0LCBjb3JlcyA9IDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sID0gbGlzdChhZGFwdF9kZWx0YSA9IDAuOTUsIG1heF90cmVlZGVwdGggPSAxMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWVkID0gMSwgZmlsZSA9ICJmaXRzL3BlY2tfbW9kZWxfZXhwZWN0YXRpb24iKQoKcGVja19tb2RlbF9leHBlY3RhdGlvbiA8LSBhZGRfY3JpdGVyaW9uKHBlY2tfbW9kZWxfZXhwZWN0YXRpb24sIGNyaXRlcmlvbiA9ICJsb28iLCBmaWxlID0gImZpdHMvcGVja19tb2RlbF9leHBlY3RhdGlvbiIpCgoKcGVja19tb2RlbF9leHBlY3RhdGlvbgojbG9vX2NvbXBhcmUocGVja19tb2RlbF90cmVhdG1lbnQsIHBlY2tfbW9kZWxfZXhwZWN0YXRpb24pCmBgYAoKKipUYWJsZSBTNioqLiBUaGUgZXN0aW1hdGVkIHBlY2sgcmF0ZSBvZiBmb3JhZ2luZyBwaWdlb25zLCBzcGxpdCBieSB0aGUgaW5kaWNhdGVkIGV4cGVjdGF0aW9uIG9mIHRoZSBvYnNlcnZlcnMuCgpgYGB7cn0KbmV3X2RhdGFfMiAlPiUgCiAgY2JpbmQoZml0dGVkKHBlY2tfbW9kZWxfZXhwZWN0YXRpb24sIG5ld2RhdGEgPSBuZXdfZGF0YV8zLCBzdW1tYXJ5ID0gVCwgcmVfZm9ybXVsYSA9IE5BKSAlPiUgCiAgICAgICAgICBhc190aWJibGUoKSAlPiUgCiAgICAgICAgICBtdXRhdGUoYWNyb3NzKDE6NCwgcm91bmQsIDIpKSkgJT4lIAogIHJlbmFtZSgiRXN0aW1hdGVkIHBlY2sgcmF0ZSIgPSBFc3RpbWF0ZSwKICAgICAgICAgIkluZGljYXRlZCBleHBlY3RhdGlvbiIgPSBCaWFzX3RyZWF0bWVudCkgJT4lIAogIHBhbmRlcigpCmBgYAoKJH4kCgojIyBGaWd1cmUgMgoKJH4kCgoqKkdldCBwb3N0ZXJpb3IgbWVhbnMgYW5kIGRpZmZlcmVuY2UgY29udHJhc3RzKioKCmBgYHtyfQoKIyB0cmVhdG1lbnQgbW9kZWwKCnBlY2tfZHJhd3NfdHJlYXRtZW50IDwtCiAgYXNfZHJhd3NfZGYocGVja19tb2RlbF90cmVhdG1lbnQpICU+JSAKICBtdXRhdGUoSHVuZ3J5ID0gZXhwKGJfQmlhc190cmVhdG1lbnRIdW5ncnkpLAogICAgICAgICBTYXRpYXRlZCA9IGV4cChiX0JpYXNfdHJlYXRtZW50U2F0aWF0ZWQpLAogICAgICAgICBkaWZmX2NvbnRyYXN0ID0gKEh1bmdyeSAtIFNhdGlhdGVkKSkgJT4lIAogIHNlbGVjdChIdW5ncnksIFNhdGlhdGVkLCBkaWZmX2NvbnRyYXN0KSAlPiUgCiAgcGl2b3RfbG9uZ2VyKG5hbWVzX3RvID0gIlRyZWF0bWVudCIsIHZhbHVlc190byA9ICJQb3N0ZXJpb3JfZXN0aW1hdGUiLCBjb2xzID0gMTozKSAlPiUgCiAgbXV0YXRlKFByZWRpY3RvciA9ICJBbGxvY2F0ZWQgcHJpbWVyIikKCnA2IDwtIAogIHBlY2tfZHJhd3NfdHJlYXRtZW50ICU+JSAKICBmaWx0ZXIoVHJlYXRtZW50ICE9ICJkaWZmX2NvbnRyYXN0IikgJT4lIAogIGdncGxvdChhZXMoeCA9IFRyZWF0bWVudCwgeSA9IFBvc3Rlcmlvcl9lc3RpbWF0ZSkpICsgCiAgIHN0YXRfaGFsZmV5ZShhZXMoZmlsbCA9IFRyZWF0bWVudCksIC53aWR0aCA9IGMoMC42NiwgMC45NSksIGFscGhhID0gMC45LAogICAgICAgICAgICAgICBwb2ludF9pbnRlcnZhbCA9ICJtZWRpYW5fcWkiLCBwb2ludF9maWxsID0gIndoaXRlIiwKICAgICAgICAgICAgICAgc2hhcGUgPSAyMSwgcG9pbnRfc2l6ZSA9IDQsIHN0cm9rZSA9IDEuNSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IG1ldC5icmV3ZXIoIkhpcm9zaGlnZSIsIDIpKSArCiAgY29vcmRfZmxpcCh5bGltID0gYyg1LCAyMCkpICsKICAjZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAyKSArCiAgI3NjYWxlX3lfY29udGludW91cyhicmVha3MgPSBjKCwgMCwgMSkpICsKICB4bGFiKCJBbGxvY2F0ZWQgcHJpbWVyIikgKwogIHlsYWIoIkVzdGltYXRlZCBwZWNrcyBwZXIgbWluIikgKwogIHRoZW1lX2J3KCkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCkpCgpwNyA8LQogIHBlY2tfZHJhd3NfdHJlYXRtZW50ICU+JSAKICBmaWx0ZXIoVHJlYXRtZW50ID09ICJkaWZmX2NvbnRyYXN0IikgJT4lIAogIGdncGxvdChhZXMoeSA9IFBvc3Rlcmlvcl9lc3RpbWF0ZSkpICsgCiAgIHN0YXRfaGFsZmV5ZShhZXMoZmlsbCA9IFRyZWF0bWVudCksIC53aWR0aCA9IGMoMC42NiwgMC45NSksIGFscGhhID0gMC45LAogICAgICAgICAgICAgICBwb2ludF9pbnRlcnZhbCA9ICJtZWRpYW5fcWkiLCBwb2ludF9maWxsID0gIndoaXRlIiwKICAgICAgICAgICAgICAgc2hhcGUgPSAyMSwgcG9pbnRfc2l6ZSA9IDQsIHN0cm9rZSA9IDEuNSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IG1ldC5icmV3ZXIoIkhpcm9zaGlnZSIpWzRdKSArCiAgY29vcmRfZmxpcCh5bGltID0gYygtNSwgMTIpKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAyKSArCiAgI3NjYWxlX3lfY29udGludW91cyhicmVha3MgPSBjKCwgMCwgMSkpICsKICB4bGFiKE5VTEwpICsKICB5bGFiKCJIdW5ncnkgLSBTYXRpYXRlZCBkaWZmZXJlbmNlXG5jb250cmFzdCAocGVja3MgcGVyIG1pbikiKSArCiAgdGhlbWVfYncoKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dC55PWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzLnk9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSkKCiMgZXhwZWN0YXRpb24gbW9kZWwKCnBlY2tfZHJhd3NfZXhwZWN0YXRpb24gPC0KICBhc19kcmF3c19kZihwZWNrX21vZGVsX2V4cGVjdGF0aW9uKSAlPiUgCiAgbXV0YXRlKEh1bmdyeSA9IGV4cChiX0V4cGVjdGF0aW9uSHVuZ3J5KSwKICAgICAgICAgU2F0aWF0ZWQgPSBleHAoYl9FeHBlY3RhdGlvblNhdGlhdGVkKSwKICAgICAgICAgZGlmZl9jb250cmFzdCA9IChIdW5ncnkgLSBTYXRpYXRlZCkpICU+JSAKICBzZWxlY3QoSHVuZ3J5LCBTYXRpYXRlZCwgZGlmZl9jb250cmFzdCkgJT4lIAogIHBpdm90X2xvbmdlcihuYW1lc190byA9ICJUcmVhdG1lbnQiLCB2YWx1ZXNfdG8gPSAiUG9zdGVyaW9yX2VzdGltYXRlIiwgY29scyA9IDE6MykgJT4lIAogIG11dGF0ZShQcmVkaWN0b3IgPSAiQWxsb2NhdGVkIHByaW1lciIpCgpwOCA8LQogIHBlY2tfZHJhd3NfZXhwZWN0YXRpb24gJT4lIAogIGZpbHRlcihUcmVhdG1lbnQgIT0gImRpZmZfY29udHJhc3QiKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gVHJlYXRtZW50LCB5ID0gUG9zdGVyaW9yX2VzdGltYXRlKSkgKyAKICAgIHN0YXRfaGFsZmV5ZShhZXMoZmlsbCA9IFRyZWF0bWVudCksIC53aWR0aCA9IGMoMC42NiwgMC45NSksIGFscGhhID0gMC45LAogICAgICAgICAgICAgICBwb2ludF9pbnRlcnZhbCA9ICJtZWRpYW5fcWkiLCBwb2ludF9maWxsID0gIndoaXRlIiwKICAgICAgICAgICAgICAgc2hhcGUgPSAyMSwgcG9pbnRfc2l6ZSA9IDQsIHN0cm9rZSA9IDEuNSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IG1ldC5icmV3ZXIoIkhpcm9zaGlnZSIsIDIpKSArCiAgY29vcmRfZmxpcCh5bGltID0gYyg1LCAyMCkpICsKICAjZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAyKSArCiAgI3NjYWxlX3lfY29udGludW91cyhicmVha3MgPSBjKCwgMCwgMSkpICsKICB4bGFiKCJJbmRpY2F0ZWQgZXhwZWN0YXRpb24iKSArCiAgeWxhYigiRXN0aW1hdGVkIHBlY2tzIHBlciBtaW4iKSArCiAgdGhlbWVfYncoKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSkKCnA5IDwtCiAgcGVja19kcmF3c19leHBlY3RhdGlvbiAlPiUgCiAgZmlsdGVyKFRyZWF0bWVudCA9PSAiZGlmZl9jb250cmFzdCIpICU+JSAKICBnZ3Bsb3QoYWVzKHkgPSBQb3N0ZXJpb3JfZXN0aW1hdGUpKSArIAogICBzdGF0X2hhbGZleWUoYWVzKGZpbGwgPSBUcmVhdG1lbnQpLCAud2lkdGggPSBjKDAuNjYsIDAuOTUpLCBhbHBoYSA9IDAuOSwKICAgICAgICAgICAgICAgcG9pbnRfaW50ZXJ2YWwgPSAibWVkaWFuX3FpIiwgcG9pbnRfZmlsbCA9ICJ3aGl0ZSIsCiAgICAgICAgICAgICAgIHNoYXBlID0gMjEsIHBvaW50X3NpemUgPSA0LCBzdHJva2UgPSAxLjUpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBtZXQuYnJld2VyKCJIaXJvc2hpZ2UiKVs0XSkgKwogIGNvb3JkX2ZsaXAoeWxpbSA9IGMoLTUsIDEyKSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gMikgKwogICNzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gYygsIDAsIDEpKSArCiAgeGxhYihOVUxMKSArCiAgeWxhYigiSHVuZ3J5IC0gU2F0aWF0ZWQgZGlmZmVyZW5jZVxuY29udHJhc3QgKHBlY2tzIHBlciBtaW4pIikgKwogIHRoZW1lX2J3KCkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQueT1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcy55PWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCkpCmBgYAoKUGxvdAoKYGBge3IsIGZpZy5oZWlnaHQ9OH0KKHA2ICsgcDcpIC8gKHA4ICsgcDkpICsKICAgcGxvdF9hbm5vdGF0aW9uKHRhZ19sZXZlbHMgPSAnYScpCmBgYAoKKipGaWd1cmUgMioqLiBQb3N0ZXJpb3IgbWVhbiBlc3RpbWF0ZXMgYW5kIGRpZmZlcmVuY2UgY29udHJhc3RzIGZvciBvYnNlcnZlciBlc3RpbWF0ZWQgcGlnZW9uIGZlZWRpbmcgcmF0ZS4gKiphKiogc2hvd3MgdGhlIHBvc3RlcmlvciBtZWFucyBmb3Igb2JzZXJ2ZXJzIHRoYXQgZWl0aGVyIHJlY2VpdmVkIGEgcHJpbWVyIHRoYXQgaW5kaWNhdGVkIHNhdGlhdGVkIHBpZ2VvbnMgb3Igb25lIHRoYXQgaW5kaWNhdGVkIGh1bmdyeSBwaWdlb25zLiAqKmIqKiBzaG93cyB0aGUgcG9zdGVyaW9yIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgbWVhbiBlc3RpbWF0ZXMgc2hvd24gaW4gKiphKiouICoqYyoqIGFuZCAqKmQqKiBzaG93IHRoZSBzYW1lIHBvc3RlcmlvcnMgYXMgKiphKiogYW5kICoqYioqIGV4Y2VwdCB0aGVzZSBhcmUgc3BsaXQgYnkgdGhlIGluZGljYXRlZCBleHBlY3RhdGlvbiBvZiB0aGUgb2JzZXJ2ZXIncywgcmF0aGVyIHRoYW4gdGhvc2UgYWxsb2NhdGVkIHRvIHRoZW0uIFRoZSBjb2xvdXJlZCBhcmVhIGlzIHRoZSBwb3N0ZXJpb3IgZGlzdHJpYnV0aW9uIGFuZCB0aGUgYmxhY2sgcG9pbnQgaXMgdGhlIG1lYW4gZXN0aW1hdGUgd2l0aCBhc3NvY2lhdGVkIDY3JSBhbmQgOTUlIHVuY2VydGFpbnR5IGludGVydmFscy4=